package cn.itcast.service;

import cn.itcast.result.PageBean;
import cn.itheima.orders.dto.OrdersPageQueryDTO;
import cn.itheima.orders.dto.OrdersPaymentDTO;
import cn.itheima.orders.dto.OrdersSubmitDTO;
import cn.itheima.orders.pojo.Orders;
import cn.itheima.orders.vo.*;
import cn.itheima.sys.vo.BusinessDataVO;
import cn.itheima.sys.vo.SalesTop10ReportVO;
import cn.itheima.sys.vo.TurnoverReportVO;
import org.springframework.web.bind.annotation.GetMapping;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

public interface OrderService {

    /**
     * 订单搜索
     *
     * @param ordersPageQueryDTO 搜索条件
     * @return 无
     */
    PageBean pageQuery(OrdersPageQueryDTO ordersPageQueryDTO);

    /**
     *  完成订单
     * @param id 订单id
     */
    void complete(Long id);

    /**
     *   拒绝订单
     * @param orders 订单信息
     */
    void rejection(Orders orders);

    /**
     *  接单
     * @param orders 订单id
     */
    void confirm(Orders orders);

    /**
     * 派送订单
     * @param id 订单id
     */
    void delivery(Long id);

    /**
     *
     * @param ordersSubmitDTO  订单信息
     * @return 订单记录信息
     */
    OrderSubmitVO submitOrder(OrdersSubmitDTO ordersSubmitDTO);

    /**
     * 订单支付
     * @param ordersPaymentDTO  订单的支付信息
     * @return 订单预支付信息
     */
    OrderPaymentVO payment(OrdersPaymentDTO ordersPaymentDTO) throws Exception;

    /**
     * 支付成功，修改订单状态
     * @param outTradeNo  支付成功回调
     */
    void paySuccess(String outTradeNo);

    /**
     * 历史订单查询
     * @param ordersPageQueryDTO 订单分页查询条件
     * @return 订单列表
     */
    PageBean getHistoryOrders(OrdersPageQueryDTO ordersPageQueryDTO);

    /**
     *  根据id查询订单详情
     * @param id 订单id
     * @return 订单详情
     */
    OrderVO getDetailById(Long id);

    /**
     *  取消订单
     * @param order 订单信息
     */
    void cancel(Orders order);

    /**
     *  再来一单
     * @param id 订单id
     */
    void repetition(Long id);


    /**
     *   各个状态的订单数量统计
     *
     * @return 获取统计接口
     */
    OrderStatisticsVO getStatistics();

    /**
     *  用户催单
     * @param id
     */
    void reminder(Long id);

    List<TurnoverReportVO>  getSumByDate(LocalDate begin, LocalDate end);

    Integer countByMap(Map<String, Object> map);

    BusinessDataVO getBusinessData(LocalDateTime begin, LocalDateTime end);

    List<BusinessDataVO> getBusinessListData(LocalDateTime begin, LocalDateTime end);

    List<SalesTop10ReportVO> countDishAndSetmealByTime(LocalDate begin, LocalDate end);

    OrderOverViewVO getAllCountByStatus(LocalDateTime start, LocalDateTime end);

}